#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <ctype.h>

#include "ILexer.h"
#include "Scintilla.h"
#include "SciLexer.h"

#include "PropSetSimple.h"
#include "WordList.h"
#include "LexAccessor.h"
#include "Accessor.h"
#include "LexerModule.h"
#include "LexerBase.h"

#ifdef SCI_NAMESPACE
using namespace Scintilla;
#endif

LexerBase::LexerBase() {
  for( int wl = 0; wl < numWordLists; wl++ ) {
    keyWordLists[wl] = new WordList;
  }
  keyWordLists[numWordLists] = 0;
}

LexerBase::~LexerBase() {
  for( int wl = 0; wl < numWordLists; wl++ ) {
    delete keyWordLists[wl];
    keyWordLists[wl] = 0;
  }
  keyWordLists[numWordLists] = 0;
}

void  LexerBase::Release() {
  delete this;
}

int  LexerBase::Version() const {
  return lvOriginal;
}

const char *  LexerBase::PropertyNames() {
  return "";
}

int  LexerBase::PropertyType( const char * ) {
  return SC_TYPE_BOOLEAN;
}

const char *  LexerBase::DescribeProperty( const char * ) {
  return "";
}

int  LexerBase::PropertySet( const char *key, const char *val ) {
  const char *valOld = props.Get( key );
  if( strcmp( val, valOld ) != 0 ) {
    props.Set( key, val );
    return 0;
  } else {
    return -1;
  }
}

const char *  LexerBase::DescribeWordListSets() {
  return "";
}

int  LexerBase::WordListSet( int n, const char *wl ) {
  if( n < numWordLists ) {
    WordList wlNew;
    wlNew.Set( wl );
    if( *keyWordLists[n] != wlNew ) {
      keyWordLists[n]->Set( wl );
      return 0;
    }
  }
  return -1;
}

void *  LexerBase::PrivateCall( int, void * ) {
  return 0;
}
